package com.xia.springboot.controller;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import com.xia.springboot.common.Result;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.yaml.snakeyaml.util.UriEncoder;

//设置跨域
@CrossOrigin
@RestController
@RequestMapping("/files")
public class FileController {

  private static String USER_DIR = System.getProperty("user.dir");


  @PostMapping("/upload")
  public Result<?> upload(MultipartFile file) throws IOException {
    // 定义文件的唯一标识
    String flag = IdUtil.fastSimpleUUID();
    // 获取文件的文件名
    String originalFilename = file.getOriginalFilename();
    //        拼接总的文件名
    String fileName = flag + "_" + UriEncoder.encode(originalFilename);
    // 获取上传的路径
    String rootFilePath = USER_DIR + "/files/" + fileName;
    // 将文件写入你的路径
    FileUtil.writeBytes(file.getBytes(), rootFilePath);
    // 返回文件的URL
    return Result.success(fileName);
  }

  /**
   * 前端使用src标签绑定一个图片的时候就会使用到Get方法预览到网页上，注释掉这个方法就会无法预览 和青戈的不一样，因为上面文件上传的返回值就是一个准确的文件名，所以这里就不用再模糊搜索，直接返回对应的图片就可以了
   *
   * @param flag     图片的标识
   * @param response 回复流
   */
  @GetMapping("/{flag}")
  public void getFiles(@PathVariable String flag, HttpServletResponse response)
      throws IOException {
    String basePath = USER_DIR + "/files/";
    response.addHeader("Content-Disposition",
        "attachment;filename=" + flag);
    response.setContentType("application/octet-stream");
    byte[] bytes = FileUtil.readBytes(basePath + flag);
    OutputStream os = response.getOutputStream();
    os.write(bytes);
    os.flush();
    os.close();
  }
}
